{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "7ecc7207",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T10:32:40.707552Z",
     "start_time": "2021-11-15T10:32:38.556590Z"
    }
   },
   "outputs": [],
   "source": [
    "from autogluon.tabular import TabularDataset, TabularPredictor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4a392ef1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T10:32:40.724460Z",
     "start_time": "2021-11-15T10:32:40.709389Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "['sample_submission.csv', 'train.csv', 'test.csv', 'data', 'store.csv']"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "os.listdir('../data/Rossmann')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "6bc8546b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T10:32:41.381190Z",
     "start_time": "2021-11-15T10:32:40.727272Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "train_data = TabularDataset('../data/Rossmann/train.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "21370fd8",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T10:32:41.388220Z",
     "start_time": "2021-11-15T10:32:41.384037Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1017209, 8)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "4ba99057",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T10:32:41.405593Z",
     "start_time": "2021-11-15T10:32:41.390062Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Store</th>\n",
       "      <th>DayOfWeek</th>\n",
       "      <th>Date</th>\n",
       "      <th>Sales</th>\n",
       "      <th>Open</th>\n",
       "      <th>Promo</th>\n",
       "      <th>StateHoliday</th>\n",
       "      <th>SchoolHoliday</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>2015-07-31</td>\n",
       "      <td>5263</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "      <td>2015-07-31</td>\n",
       "      <td>6064</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>5</td>\n",
       "      <td>2015-07-31</td>\n",
       "      <td>8314</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>2015-07-31</td>\n",
       "      <td>13995</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>5</td>\n",
       "      <td>2015-07-31</td>\n",
       "      <td>4822</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Store  DayOfWeek        Date  Sales  Open  Promo StateHoliday  \\\n",
       "0      1          5  2015-07-31   5263     1      1            0   \n",
       "1      2          5  2015-07-31   6064     1      1            0   \n",
       "2      3          5  2015-07-31   8314     1      1            0   \n",
       "3      4          5  2015-07-31  13995     1      1            0   \n",
       "4      5          5  2015-07-31   4822     1      1            0   \n",
       "\n",
       "   SchoolHoliday  \n",
       "0              1  \n",
       "1              1  \n",
       "2              1  \n",
       "3              1  \n",
       "4              1  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ec3eacc4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T10:32:41.410158Z",
     "start_time": "2021-11-15T10:32:41.407119Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n"
     ]
    }
   ],
   "source": [
    "label = 'Sales'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a225cdb6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T11:36:31.211331Z",
     "start_time": "2021-11-15T10:32:41.411800Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Warning: path already exists! This predictor may overwrite an existing predictor! path=\"agModels-kaggle_Rossmann\"\n",
      "Warning: Training may take a very long time because `time_limit` was not specified and `train_data` is large (1017209 samples, 175.98 MB).\n",
      "\tConsider setting `time_limit` to ensure training finishes within an expected duration or experiment with a small portion of `train_data` to identify an ideal `presets` and `hyperparameters` configuration.\n",
      "Beginning AutoGluon training ...\n",
      "AutoGluon will save models to \"agModels-kaggle_Rossmann/\"\n",
      "AutoGluon Version:  0.2.1b20210716\n",
      "Train Data Rows:    1017209\n",
      "Train Data Columns: 7\n",
      "Preprocessing data ...\n",
      "AutoGluon infers your prediction problem is: 'regression' (because dtype of label-column == int and many unique label-values observed).\n",
      "\tLabel info (max, min, mean, stddev): (41551, 0, 5773.81897, 3849.92618)\n",
      "\tIf 'regression' is not the correct problem_type, please manually specify the problem_type argument in fit() (You may specify problem_type as one of: ['binary', 'multiclass', 'regression'])\n",
      "Using Feature Generators to preprocess the data ...\n",
      "Fitting AutoMLPipelineFeatureGenerator...\n",
      "\tAvailable Memory:                    257872.4 MB\n",
      "\tTrain Data (Original)  Memory Usage: 167.84 MB (0.1% of available memory)\n",
      "\tInferring data type of each feature based on column values. Set feature_metadata_in to manually specify special dtypes of the features.\n",
      "\tStage 1 Generators:\n",
      "\t\tFitting AsTypeFeatureGenerator...\n",
      "\tStage 2 Generators:\n",
      "\t\tFitting FillNaFeatureGenerator...\n",
      "\tStage 3 Generators:\n",
      "\t\tFitting IdentityFeatureGenerator...\n",
      "\t\tFitting CategoryFeatureGenerator...\n",
      "\t\t\tFitting CategoryMemoryMinimizeFeatureGenerator...\n",
      "\t\tFitting DatetimeFeatureGenerator...\n",
      "\tStage 4 Generators:\n",
      "\t\tFitting DropUniqueFeatureGenerator...\n",
      "\tTypes of features in original data (raw dtype, special dtypes):\n",
      "\t\t('int', [])                        : 5 | ['Store', 'DayOfWeek', 'Open', 'Promo', 'SchoolHoliday']\n",
      "\t\t('object', [])                     : 1 | ['StateHoliday']\n",
      "\t\t('object', ['datetime_as_object']) : 1 | ['Date']\n",
      "\tTypes of features in processed data (raw dtype, special dtypes):\n",
      "\t\t('category', [])             : 1 | ['StateHoliday']\n",
      "\t\t('int', [])                  : 5 | ['Store', 'DayOfWeek', 'Open', 'Promo', 'SchoolHoliday']\n",
      "\t\t('int', ['datetime_as_int']) : 1 | ['Date']\n",
      "\t3.5s = Fit runtime\n",
      "\t7 features in original data used to generate 7 features in processed data.\n",
      "\tTrain Data (Processed) Memory Usage: 49.84 MB (0.0% of available memory)\n",
      "Data preprocessing and feature engineering runtime = 4.09s ...\n",
      "AutoGluon will gauge predictive performance using evaluation metric: 'root_mean_squared_error'\n",
      "\tTo change this, specify the eval_metric argument of fit()\n",
      "Automatically generating train/validation split with holdout_frac=0.01, Train Rows: 1007036, Val Rows: 10173\n",
      "Fitting 11 L1 models ...\n",
      "Fitting model: KNeighborsUnif ...\n",
      "\t-1350.5363\t = Validation root_mean_squared_error score\n",
      "\t3.85s\t = Training runtime\n",
      "\t0.26s\t = Validation runtime\n",
      "Fitting model: KNeighborsDist ...\n",
      "\t-1280.5449\t = Validation root_mean_squared_error score\n",
      "\t4.0s\t = Training runtime\n",
      "\t0.24s\t = Validation runtime\n",
      "Fitting model: LightGBMXT ...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1000]\ttrain_set's rmse: 2446.68\tvalid_set's rmse: 2418.43\n",
      "[2000]\ttrain_set's rmse: 2405.58\tvalid_set's rmse: 2378.32\n",
      "[3000]\ttrain_set's rmse: 2378.38\tvalid_set's rmse: 2353.67\n",
      "[4000]\ttrain_set's rmse: 2359.43\tvalid_set's rmse: 2337.24\n",
      "[5000]\ttrain_set's rmse: 2343.78\tvalid_set's rmse: 2323.52\n",
      "[6000]\ttrain_set's rmse: 2328.59\tvalid_set's rmse: 2310.06\n",
      "[7000]\ttrain_set's rmse: 2318.41\tvalid_set's rmse: 2301.97\n",
      "[8000]\ttrain_set's rmse: 2307.94\tvalid_set's rmse: 2293.3\n",
      "[9000]\ttrain_set's rmse: 2299.01\tvalid_set's rmse: 2285.75\n",
      "[10000]\ttrain_set's rmse: 2289.8\tvalid_set's rmse: 2277.66\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\t-2277.6638\t = Validation root_mean_squared_error score\n",
      "\t497.17s\t = Training runtime\n",
      "\t0.95s\t = Validation runtime\n",
      "Fitting model: LightGBM ...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1000]\ttrain_set's rmse: 2153.5\tvalid_set's rmse: 2149.22\n",
      "[2000]\ttrain_set's rmse: 2129.91\tvalid_set's rmse: 2138.98\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\t-2138.2235\t = Validation root_mean_squared_error score\n",
      "\t279.36s\t = Training runtime\n",
      "\t0.25s\t = Validation runtime\n",
      "Fitting model: RandomForestMSE ...\n",
      "\t-1392.6051\t = Validation root_mean_squared_error score\n",
      "\t83.26s\t = Training runtime\n",
      "\t1.75s\t = Validation runtime\n",
      "Fitting model: CatBoost ...\n",
      "\t-2218.244\t = Validation root_mean_squared_error score\n",
      "\t460.89s\t = Training runtime\n",
      "\t0.05s\t = Validation runtime\n",
      "Fitting model: ExtraTreesMSE ...\n",
      "\t-2318.9767\t = Validation root_mean_squared_error score\n",
      "\t41.77s\t = Training runtime\n",
      "\t1.76s\t = Validation runtime\n",
      "Fitting model: NeuralNetFastAI ...\n",
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/tables/__init__.py:99: DeprecationWarning: `np.typeDict` is a deprecated alias for `np.sctypeDict`.\n",
      "  from .utilsextension import (\n",
      "\t-2483.8938\t = Validation root_mean_squared_error score\n",
      "\t1896.79s\t = Training runtime\n",
      "\t0.25s\t = Validation runtime\n",
      "Fitting model: XGBoost ...\n",
      "\tWarning: Exception caused XGBoost to fail during training (ImportError)... Skipping this model.\n",
      "\t\tcannot import name 'EarlyStopping' from 'xgboost.callback' (/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/xgboost/callback.py)\n",
      "Fitting model: NeuralNetMXNet ...\n",
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/h5py/__init__.py:46: DeprecationWarning: `np.typeDict` is a deprecated alias for `np.sctypeDict`.\n",
      "  from ._conv import register_converters as _register_converters\n",
      "\tWarning: Exception caused NeuralNetMXNet to fail during training... Skipping this model.\n",
      "\t\tLegacy mxnet==1.4.0 detected, some new modules will not work properly. mxnet>=1.6.0 is required. You can use pip to upgrade mxnet `pip install mxnet --upgrade` or `pip install mxnet_cu101 --upgrade`\n",
      "Detailed Traceback:\n",
      "Traceback (most recent call last):\n",
      "  File \"/mnt/disk0/home/caihengxing/software/autogluon-master/tabular/src/autogluon/tabular/trainer/abstract_trainer.py\", line 960, in _train_and_save\n",
      "    model = self._train_single(X, y, model, X_val, y_val, **model_fit_kwargs)\n",
      "  File \"/mnt/disk0/home/caihengxing/software/autogluon-master/tabular/src/autogluon/tabular/trainer/abstract_trainer.py\", line 932, in _train_single\n",
      "    model = model.fit(X=X, y=y, X_val=X_val, y_val=y_val, **model_fit_kwargs)\n",
      "  File \"/mnt/disk0/home/caihengxing/software/autogluon-master/core/src/autogluon/core/models/abstract/abstract_model.py\", line 518, in fit\n",
      "    out = self._fit(**kwargs)\n",
      "  File \"/mnt/disk0/home/caihengxing/software/autogluon-master/tabular/src/autogluon/tabular/models/tabular_nn/tabular_nn_model.py\", line 168, in _fit\n",
      "    try_import_mxnet()\n",
      "  File \"/mnt/disk0/home/caihengxing/software/autogluon-master/core/src/autogluon/core/utils/try_import.py\", line 40, in try_import_mxnet\n",
      "    raise ValueError(msg)\n",
      "ValueError: Legacy mxnet==1.4.0 detected, some new modules will not work properly. mxnet>=1.6.0 is required. You can use pip to upgrade mxnet `pip install mxnet --upgrade` or `pip install mxnet_cu101 --upgrade`\n",
      "Fitting model: LightGBMLarge ...\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1000]\ttrain_set's rmse: 2118.63\tvalid_set's rmse: 2134.67\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\t-2134.5795\t = Validation root_mean_squared_error score\n",
      "\t263.79s\t = Training runtime\n",
      "\t0.18s\t = Validation runtime\n",
      "Fitting model: WeightedEnsemble_L2 ...\n",
      "\t-1085.4204\t = Validation root_mean_squared_error score\n",
      "\t1.69s\t = Training runtime\n",
      "\t0.0s\t = Validation runtime\n",
      "AutoGluon training complete, total runtime = 3829.69s ...\n",
      "TabularPredictor saved. To load, use: predictor = TabularPredictor.load(\"agModels-kaggle_Rossmann/\")\n"
     ]
    }
   ],
   "source": [
    "save_path = 'agModels-kaggle_Rossmann'  # specifies folder to store trained models\n",
    "predictor = TabularPredictor(label=label, path=save_path).fit(train_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "fa84c4eb",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T11:36:31.274833Z",
     "start_time": "2021-11-15T11:36:31.219372Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n",
      "Loaded data from: ../data/Rossmann/test.csv | Columns = 7 / 7 | Rows = 41088 -> 41088\n"
     ]
    }
   ],
   "source": [
    "test_data_nolab = TabularDataset('../data/Rossmann/test.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "54cce4ce",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T11:37:31.535830Z",
     "start_time": "2021-11-15T11:36:31.278812Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: Int features without null values at train time contain null values at inference time! Imputing nulls to 0. To avoid this, pass the features as floats during fit!\n",
      "WARNING: Int features with nulls: ['Open']\n"
     ]
    }
   ],
   "source": [
    "y_pred = predictor.predict(test_data_nolab)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "ca6cc9bf",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T11:37:31.549138Z",
     "start_time": "2021-11-15T11:37:31.539026Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0         5532.860840\n",
       "1         8010.153809\n",
       "2         9790.115234\n",
       "3         8342.261719\n",
       "4         7489.771484\n",
       "             ...     \n",
       "41083     2967.420654\n",
       "41084     8049.800781\n",
       "41085     5299.546875\n",
       "41086    21946.123047\n",
       "41087     6722.391113\n",
       "Name: Sales, Length: 41088, dtype: float32"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "240cd16c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T11:37:31.566133Z",
     "start_time": "2021-11-15T11:37:31.551370Z"
    }
   },
   "outputs": [],
   "source": [
    "id_ = ['Id']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "6d40a09f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T12:06:07.640438Z",
     "start_time": "2021-11-15T12:06:07.589243Z"
    }
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "submit = pd.read_csv('../data/Rossmann/sample_submission.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "b4fd354e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T12:06:20.843564Z",
     "start_time": "2021-11-15T12:06:20.788715Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n"
     ]
    }
   ],
   "source": [
    "sub = submit[id_].copy()\n",
    "sub[label] = list(y_pred.values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "c59b336a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T12:06:23.392527Z",
     "start_time": "2021-11-15T12:06:23.066475Z"
    }
   },
   "outputs": [],
   "source": [
    "sub.to_csv(\"./autogluon_sub_Rossmann.csv\", index = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "c43926aa",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-11-15T12:06:24.363653Z",
     "start_time": "2021-11-15T12:06:24.360811Z"
    }
   },
   "outputs": [],
   "source": [
    "# !zip -r autogluon_sub_kaggle_ventilator.csv.zip autogluon_sub_kaggle_ventilator.csv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6b54628e",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
